package edu.cuit.avatar.concurrent;

import jdk.internal.misc.Unsafe;

import java.util.concurrent.atomic.AtomicInteger;

/**
 *
 * 悲观锁和乐观锁时两种不同的并发控制策略，用于解决多线程环境下数据一致性问题
 * 悲观锁  vs  乐观锁
 * 悲观锁: 假设并发冲突一定会发生，因此再访问共享数据前先加锁，防止其它线程同时修改。synchronize和Lock
 * 乐观锁: 假设并发冲突不一定会发生，只在提交数据更新检查数据是否被修改。CAS(AtomicXxx)、版本号机制
 *      先操作数据，提交(更新)时检查冲突
 *      适合读操作比较多的情况
 *      不阻塞线程,并发性能较好
 *      可能出现更新失败需要重试
 *      不能保证强一致性
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/17 16:07
 */
public class OptimisticLockDemo {
    private int value = 0;

    //需要添加jvm参数: --add-opens java.base/jdk.internal.misc=ALL-UNNAMED
    private static final Unsafe U = Unsafe.getUnsafe();

    //内存中记录的偏移量的值
    private static final long VALUE
            = U.objectFieldOffset(OptimisticLockDemo.class, "value");

    public static void main(String[] args) {
        OptimisticLockDemo optimistic = new OptimisticLockDemo();
        int oldValue = optimistic.value;
        //可能出现更新失败需要重试
        while(!U.compareAndSetInt(optimistic, VALUE, oldValue, oldValue + 1)){
            oldValue = optimistic.value;
        }

        System.out.println("更新成功,值:" + optimistic.value);
    }
}
